home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / util / cdity / ModeProSrc.lha / Daemon / OldPatch / MPPatch.c10 < prev    next >
Text File  |  1996-06-23  |  36KB  |  1,495 lines

  1. #include "MP.h"
  2. #include <graphics/videocontrol.h>
  3. #include <graphics/displayinfo.h>
  4. #include <debug.h>
  5.  
  6. ULONG Colors[]={1<<16|0,~0,0,0,0};
  7.  
  8. #define HAM_EHB_DP_KEY (HAM_KEY | 0x400 | EXTRAHALFBRITE_KEY)
  9. //                                DualPF
  10. //BOOL MPSem->Debug=FALSE;
  11.  
  12. #define ADD_DEBUG_CODE
  13.  
  14. /* kprintf
  15.  
  16. #ifdef ADD_DEBUG_CODE
  17.       if(MPSem->Debug)
  18.       {
  19.       }
  20. #endif
  21.  
  22. */
  23.  
  24. #ifdef ADD_DEBUG_CODE
  25. void PrintTags(struct TagItem *tags);
  26. UBYTE *FindTagSting(ULONG id);
  27. void PrintDefNode(struct DefaultNode *DN);
  28. #endif
  29.  
  30. #define AllocOpenNode(on)  (on ? on: AllocMem(sizeof(struct OpenNode),MEMF_CLEAR|MEMF_PUBLIC))
  31.   
  32. void CatchDNode(ULONG list,UBYTE *Name);
  33. //void PrintTags(struct TagItem *tags);
  34. //UBYTE *FindTagSting(ULONG ID);
  35. void CloneTextAttr(struct TTextAttr *Source, struct TTextAttr *Dest);
  36.  
  37. extern ULONG CenterAll;
  38. extern struct MPSem *MPSem;
  39. extern CxObj  *Broker;
  40. extern struct MsgPort *BrokerPort;
  41. extern STRPTR MiscText[];
  42. extern BOOL V39;
  43. extern BYTE PublicSignal;
  44. extern struct Process  *MPTask;
  45. extern UWORD NumDriPens;
  46. // extern defaultpens[];
  47. extern struct MsgPort *CatchPort;
  48. extern struct Screen ASM *(*OldOpenScreen)(REG __a0 struct NewScreen *,REG __a6 struct IntuitionBase *);
  49. extern struct Screen ASM *(*OldOpenScreenTagList)(REG __a0 struct ExtNewScreen *ns,
  50.                                              REG __a1 struct TagItem *taglist,
  51.                                              REG __a6 struct IntuitionBase * );
  52. extern BOOL ASM (*OldCloseScreen)(REG __a0 struct Screen *,REG __a6 struct IntuitionBase *);
  53. extern struct Window ASM *(*OldOpenWindow)(REG __a0 struct NewWindow *nw,
  54.                                              REG __a6 struct IntuitionBase *lib);
  55. extern struct Window ASM *(*OldOpenWindowTagList)(REG __a0 struct NewWindow *nw,
  56.                                                     REG __a1 struct TagItem *tags,
  57.                                                     REG __a6 struct IntuitionBase *lib);
  58. extern BOOL ASM *(*OldLayoutMenusA)(REG __a0 struct Menu *fm,
  59.                                       REG __a1 APTR vi, 
  60.                                       REG __a2 struct TagItem *tags,
  61.                                       REG __a6 struct Library *lib);
  62. extern LONG ASM (*OldCloseWorkBench)(REG __a6 struct IntuitionBase *lib);
  63.  
  64. struct Screen ASM __saveds  *NewOpenScreen(REG __a0 struct ExtNewScreen *ns,
  65.                                            REG __a6 struct IntuitionBase *IBase)
  66. {
  67.  
  68.   return(NewOpenScreenTagList(ns,(ns->Type & NS_EXTENDED ?ns->Extension:0),IBase ));
  69. }
  70.  
  71. struct DimensionInfo diminfo;
  72. struct DisplayInfo   dispinfo;
  73.  
  74. UBYTE *Topaz="topaz.font";
  75.  
  76. struct Screen *scr;
  77. struct TextFont *textfont;
  78. struct ScreenModeRequester *sr;
  79. struct ColorSpec Colors4[257];
  80. ULONG  Colors32[256*3+2];
  81.  
  82. WORD   width,
  83.        height,
  84.        depth;
  85. BOOL   dodepth;
  86.  
  87. LONG   autoscroll,
  88.        look3d,
  89.        modeid,
  90.        overscan,
  91.        interleave,
  92.        wbscr;
  93.        //likewb;
  94. BOOL   changed,modechanged;
  95.        
  96. WORD   pens[]={~0},
  97.        *screenpens;
  98.        
  99. struct Task *task;
  100. struct DefaultNode *n;
  101. struct TagItem ti[23],
  102.               *tag;
  103. /*
  104. struct TagItem VCTags[2]=
  105. {
  106.   VC_NoColorPaletteLoad, TRUE,
  107.   TAG_DONE,0
  108. };
  109. */
  110.               
  111. struct TagItem fonttags[]=
  112. {
  113.   TA_DeviceDPI,(1<<16) | 1,TAG_DONE,0
  114. };
  115.  
  116.  
  117. ULONG  TagNum,ehbham;
  118.  
  119. struct TextAttr *storedfont;
  120.  
  121. UBYTE  CLIName[41],*taskname;
  122. UBYTE *title;
  123.        
  124. struct OpenNode *ON;
  125.  
  126. LONG custombm;
  127.  
  128. WORD dripens[DRIPENS+1];   
  129.  
  130. struct DisplayInfo P_DispInfo;
  131.  
  132. struct Screen ASM __saveds  *NewOpenScreenTagList(REG __a0 struct ExtNewScreen *ns,
  133.                                                   REG __a1 struct TagItem *TagList,
  134.                                                   REG __a6 struct IntuitionBase *IBase)
  135. {
  136.   STRPTR TaskName
  137.   
  138.   if(GetProgramName(CLIName,40)) /* Get cli program's name */
  139.     if(CLIName[0]!=0)            /* make sure CLIName contains something */
  140.       taskname=CLIName;
  141.  
  142.  
  143.   PromoteScreen(ns,TagList,0,IBase);      
  144. }
  145.       
  146. struct Screen ASM __saveds  *NewOpenScreenTagList(REG __a0 struct ExtNewScreen *ns,
  147.                                                   REG __a1 struct TagItem *TagList,
  148.                                                   REG __a6 struct IntuitionBase *IBase)
  149. {
  150.   struct BitMap *bitmap;
  151.   struct Rectangle odclip;
  152.   struct DefaultNode fakedn={0};
  153.  
  154.   ObtainSemaphoreShared(&MPSem->ListSem); 
  155.   ObtainSemaphore(&MPSem->NodeSem); 
  156.   
  157. #ifdef ADD_DEBUG_CODE
  158.   if(MPSem->Debug)
  159.   {
  160.     kprintf("\n--------------------------------\nOpenScreen(%8lx) -- %s\n",ns,FindTask(0)->tc_Node.ln_Name);
  161.     kprintf("  IntuitionBase=%8lx\n",IBase);
  162.     if(ns)
  163.     {
  164.       kprintf("  NewScreen structure:\n");
  165.       kprintf("    LeftEdge=%ld TopEdge=%ld\n    Width=%ld Height=%ld\n    Depth=%ld\n    dpen=%ld bpen=%ld\n    vm=%8lx type=%ld\n    font=%8lx\n",
  166.         ns->LeftEdge, ns->TopEdge, ns->Width, ns->Height, ns->Depth,
  167.         ns->DetailPen, ns->BlockPen, ns->ViewModes, ns->Type, ns->Font);
  168.       if(ns->DefaultTitle)
  169.         kprintf("    defaulttitle=%s\n", ns->DefaultTitle);
  170.       kprintf("    gadgets=%8lx  bitmap=%8lx\n",
  171.         ns->Gadgets, ns->CustomBitMap);
  172.       if(ns->Type & NS_EXTENDED)
  173.         kprintf("    * is NS_EXTENDED\n");
  174.     }  
  175.     if(TagList)
  176.       PrintTags(TagList);
  177.   }
  178. #endif
  179.   
  180.   /* Now that we've got the semaphore all globals are mine */
  181.   /* initialize everything */
  182.  
  183.   TagNum=0;
  184.  
  185.   title=NULL;
  186.  
  187.   ON=NULL;   //likewb=0;
  188.   
  189.   custombm=changed=modechanged=look3d=overscan=interleave=0L;
  190.   depth=1;
  191.   dodepth=FALSE;
  192.   
  193.   wbscr=0;  
  194.   
  195.   width=height=autoscroll=modeid=-1;
  196.  
  197.   screenpens=pens;
  198.   
  199.   task=FindTask(0);
  200.   taskname=task->tc_Node.ln_Name;
  201.  
  202.   if(GetProgramName(CLIName,40)) /* Get cli program's name */
  203.     if(CLIName[0]!=0)            /* make sure CLIName contains something */
  204.       taskname=CLIName;
  205.   
  206.   /* Initialization Done */
  207.  
  208.  
  209.  
  210.   /**** Extract screen info from ns and TagList ****/  
  211.   if(ns)                     
  212.   {
  213.     storedfont=ns->Font;
  214.     width    =ns->Width;
  215.     height   =ns->Height;
  216.     modeid   =ns->ViewModes;
  217.     depth    =ns->Depth;
  218.     title    =ns->DefaultTitle;
  219.     custombm =ns->Type & CUSTOMBITMAP;
  220.     wbscr    =(ns->Type & SCREENTYPE)==WBENCHSCREEN;
  221.   }
  222.  
  223.   if(TagList)
  224.   {
  225.     //likewb=(ULONG)FindTagItem(SA_LikeWorkbench,TagList);
  226.     //kprintf("\n---------\n");
  227.     //PrintTags(TagList);
  228.     custombm  =GetTagData(SA_BitMap,    custombm,TagList);
  229.     width     =GetTagData(SA_Width,     width,   TagList);
  230.     height    =GetTagData(SA_Height,    height,  TagList);
  231.     autoscroll=GetTagData(SA_AutoScroll,autoscroll,TagList);
  232.     overscan  =GetTagData(SA_Overscan,  overscan,TagList);
  233.     modeid    =GetTagData(SA_DisplayID, modeid,  TagList);
  234.     depth     =GetTagData(SA_Depth,     depth,   TagList);
  235.     title     =(UBYTE *)GetTagData(SA_Title,(ULONG)title,TagList);
  236.     wbscr     =(GetTagData(SA_Type,wbscr,TagList) & SCREENTYPE)==WBENCHSCREEN;
  237.     interleave=GetTagData(SA_Interleaved,interleave,TagList);
  238.     if(tag=FindTagItem(SA_Overscan,TagList))
  239.       if(!FindTagItem(SA_DClip,TagList))
  240.         overscan=tag->ti_Data;
  241.     if(tag=FindTagItem(SA_Pens,TagList))
  242.     {
  243.       screenpens=(UWORD *)(tag->ti_Data);
  244.       //look3d=TRUE;
  245.     }
  246.   }
  247.  
  248.  
  249. #ifdef ADD_DEBUG_CODE
  250.   if(MPSem->Debug)
  251.   {
  252.     kprintf("..................................\n");
  253.     kprintf("w=%ld h=%ld d=%ld custombm=%8lx\n",width,height,depth,custombm);
  254.     kprintf("..................................\n");
  255.   }
  256. #endif
  257.  
  258.   n=NULL;
  259.  
  260.   ehbham=0;
  261.  
  262.   if(GetDisplayInfoData(0,(UBYTE *)&P_DispInfo,sizeof(P_DispInfo),DTAG_DISP,modeid))
  263.     ehbham=P_DispInfo.PropertyFlags & (DIPF_IS_DUALPF | DIPF_IS_HAM | 
  264.                                        DIPF_IS_PF2PRI | DIPF_IS_EXTRAHALFBRITE);
  265.   
  266.  
  267. #ifdef ADD_DEBUG_CODE
  268.   if(MPSem->Debug)
  269.   {
  270.     kprintf("wbscr=%lx\n",wbscr);
  271.   }
  272. #endif
  273.   
  274.   if(!title) title=GetString(MSG_ITEM_NO_NAME); /* Just in case ther isn't a title */
  275.  
  276.   if(!(n=FindDNode(&MPSem->PromotionList[1],title)))
  277.     if(!(n=FindDNode(&MPSem->PromotionList[0],taskname)))
  278.     { 
  279.       struct DefaultNode *smnode;
  280.       BOOL   smgo=TRUE;
  281.       ULONG  /*modenorm,*/ mode_monall,orig_monall;
  282.       
  283.       //modenorm    =modeid;// & ~HAM_EHB_DP_KEY;
  284.       mode_monall  =modeid | ALL_MODES;
  285.       
  286.       smnode=(struct DefaultNode *)MPSem->PromotionList[PL_SCREENMODES].lh_Head;
  287.       while(smnode->Def_Node.ln_Succ && smgo)
  288.       {
  289.         orig_monall =smnode->OrigDisplayID & ALL_MODES;
  290.       
  291.         if( (smnode->OrigDisplayID == modeid) ||
  292.             (orig_monall == mode_monall) )     
  293.         {
  294.           n=smnode;
  295.           smgo=FALSE;
  296.         }
  297.         smnode=(struct DefaultNode *)smnode->Def_Node.ln_Succ;
  298.       }
  299.       if(MPSem->CatchPrograms && taskname)   //Catch new names only.
  300.         CatchDNode(0,taskname);
  301.       if(MPSem->CatchScreens) 
  302.         CatchDNode(1,title);
  303.     }
  304.  
  305. #ifdef ADD_DEBUG_CODE
  306.   if(MPSem->Debug)
  307.   {
  308.     if(n)
  309.       PrintDefNode(n);
  310.   }
  311.   
  312. #endif
  313.  
  314.   if(!n && MPSem->CenterAll)
  315.   {
  316.     n=&fakedn;
  317.     
  318.     fakedn.CenterFlags=MPSem->CenterAll;
  319.   } 
  320.     
  321.  
  322.   if(!MPSem->Enabled || !n/* || wbscr*/)
  323.   {
  324.     scr=OldOpenScreenTagList(ns,TagList,IBase);
  325.     ReleaseSemaphore(&MPSem->ListSem);
  326.     ReleaseSemaphore(&MPSem->NodeSem);
  327.     return(scr);
  328.   }
  329.   
  330.   look3d     =n->Look3D;
  331.   interleave =(n->Flags & INTERLEAVE) | interleave;
  332.   screenpens =n->Pens;
  333.  
  334.   if(!wbscr)
  335.   {
  336.     switch(n->ModeSelect)
  337.     {
  338.       case 1:
  339. #ifdef ADD_DEBUG_CODE
  340.       if(MPSem->Debug)
  341.       {
  342.         kprintf("Promoting Monitor\n");
  343.       }
  344. #endif  
  345.         if(modeid != -1)
  346.         {
  347.           if(V39)
  348.           {
  349.             modeid=BestModeID(BIDTAG_SourceID       ,modeid,
  350.                               BIDTAG_MonitorID      ,n->ModeID & MONITOR_ID_MASK,
  351.                               BIDTAG_Depth          ,depth,
  352.                               BIDTAG_DIPFMustHave   ,ehbham,
  353.                               TAG_SKIP              ,(width==-1 ? 1:0),
  354.                               BIDTAG_DesiredWidth   ,width,
  355.                               TAG_SKIP              ,(height==-1 ? 1:0),
  356.                               BIDTAG_DesiredHeight  ,height,
  357.                               TAG_DONE);
  358.             //kprintf("%8lx\n",modeid);
  359.           }
  360.           else
  361.           {
  362.             modeid= (n->ModeID & MONITOR_ID_MASK) | (modeid & (~MONITOR_ID_MASK));
  363.           }
  364.           if(modeid==INVALID_ID) 
  365.              modeid=n->ModeID;
  366.               
  367.           modechanged=TRUE;
  368.         }
  369.       case 0:          
  370.         autoscroll  =n->AutoScroll;
  371.         break;
  372.       case 2:
  373. #ifdef ADD_DEBUG_CODE
  374.       if(MPSem->Debug)
  375.       {
  376.         kprintf("Promoting ScreenMode\n");
  377.       }
  378. #endif  
  379.         modeid      =n->ModeID/* | ehbham*/;
  380.         overscan    =n->OverscanType;
  381.         width       =n->Width;
  382.         height      =n->Height;
  383.         autoscroll  =n->AutoScroll;
  384.         if(n->Flags & DEPTH)
  385.         {
  386.           depth=n->Depth;
  387.           dodepth=TRUE;
  388.         }
  389.         changed=TRUE;
  390.         break;
  391.       case 3:
  392. #ifdef ADD_DEBUG_CODE
  393.       if(MPSem->Debug)
  394.       {
  395.         kprintf("Promoting with Requester\n");
  396.       }
  397. #endif  
  398.         if((sr=(struct ScreenModeRequester *)AllocAslRequestTags(ASL_ScreenModeRequest,
  399.                     ASLSM_TitleText             ,title,
  400.                     ASLSM_DoWidth               ,TRUE ,
  401.                     ASLSM_DoHeight              ,TRUE ,
  402.                     ASLSM_DoOverscanType        ,TRUE ,
  403.                     ASLSM_DoAutoScroll          ,TRUE ,
  404.                     ASLSM_DoDepth               ,n->Flags & DEPTH,
  405.                     ASLSM_InitialAutoScroll     ,n->AutoScroll,
  406.                     ASLSM_InitialDisplayWidth   ,n->Width,
  407.                     ASLSM_InitialDisplayHeight  ,n->Height,
  408.                     ASLSM_InitialDisplayID      ,n->ModeID,
  409.                     ASLSM_InitialDisplayDepth   ,n->Depth,
  410.                     ASLSM_NegativeText          ,GetString(MSG_REQ_USE_DEFAULT),
  411.                     ASLSM_PropertyFlags         ,0,
  412.                     ASLSM_PropertyMask          ,BADMODES,                      
  413.                     TAG_END 
  414.                     )))
  415.         {
  416.           if(AslRequest(sr,NULL))
  417.           {
  418.             modeid    =sr->sm_DisplayID | ehbham;
  419.             overscan  =sr->sm_OverscanType;
  420.             width     =sr->sm_DisplayWidth;
  421.             height    =sr->sm_DisplayHeight;    
  422.             changed   =TRUE;
  423.             if(n->Flags & DEPTH)
  424.             {
  425.               depth=sr->sm_DisplayDepth;
  426.               dodepth=TRUE;
  427.             }
  428.           }
  429.           FreeAslRequest(sr);  
  430.         }
  431.         break; 
  432. /*
  433.       case 4:
  434. #ifdef ADD_DEBUG_CODE
  435.       if(MPSem->Debug)
  436.       {
  437.         kprintf("Promoting to PubScreen\n");
  438.       }
  439. #endif
  440.   */      
  441.     }/* end switch*/
  442.   
  443.     /**** Setup promoted taglist ****/
  444.  
  445.  
  446.      
  447.     if( (n->Flags & DNF_FORCEPLANAR)  && 
  448.         (width>0)                     && 
  449.         (height>0)                    &&
  450.         (!custombm)                   &&
  451.         (V39)                         &&
  452.         (depth>0)  )
  453.     {
  454.  
  455.       if(bitmap=AllocBitMap(width,height,depth,BMF_CLEAR|BMF_DISPLAYABLE,0))
  456.       {
  457.  
  458.         if(ON=AllocOpenNode(ON))
  459.         {
  460.           ON->Flags|=ON_BITMAP;
  461.         
  462.           ON->BitMap=bitmap;
  463.           ti[TagNum].ti_Tag=SA_BitMap;
  464.           ti[TagNum].ti_Data=(ULONG)bitmap;
  465.           TagNum++;
  466.         }
  467.         else
  468.           FreeBitMap(bitmap);
  469.       }
  470. #ifdef ADD_DEBUG_CODE
  471.       if(MPSem->Debug)
  472.       {
  473.         kprintf("  Force Planar: Bitmap %8lx\n",bitmap);
  474.       }
  475. #endif
  476.     }
  477.     
  478.   
  479.     if(changed && !(custombm))
  480.     {
  481.       if(width!=0)
  482.       {
  483.         ti[TagNum].ti_Tag=SA_Width;
  484.         ti[TagNum].ti_Data=width;
  485.         TagNum++;
  486.       }
  487.       if(height!=0)
  488.       {
  489.         ti[TagNum].ti_Tag=SA_Height;
  490.         ti[TagNum].ti_Data=height;
  491.         TagNum++;
  492.       }
  493.       
  494.       if(FindTagItem(SA_DClip,TagList))
  495.       { // if it specifies a dclip, i need to override it.
  496.         if(QueryOverscan(modeid,&odclip,overscan))
  497.         {
  498.           ti[TagNum].ti_Tag=SA_DClip;
  499.           ti[TagNum].ti_Data=&odclip;
  500.           TagNum++;
  501.         }
  502.       }
  503.       else
  504.       {
  505.         ti[TagNum].ti_Tag=SA_Overscan;
  506.         ti[TagNum].ti_Data=overscan;
  507.         TagNum++;
  508.       }
  509.     }
  510.   
  511.     if(modechanged || changed)
  512.     {
  513.       ti[TagNum].ti_Tag=SA_DisplayID;
  514.       ti[TagNum].ti_Data=modeid;
  515.       TagNum++;
  516.     }
  517.  
  518.     if(n->Flags & SHAREPENS)
  519.     {
  520.       ti[TagNum].ti_Tag=SA_SharePens;
  521.       ti[TagNum].ti_Data=TRUE;
  522.       TagNum++;
  523.     }
  524.  
  525.     if(dodepth && !(custombm) && !(ehbham))
  526.     {
  527.       ti[TagNum].ti_Tag=SA_Depth;
  528.       ti[TagNum].ti_Data=depth;
  529.       TagNum++;
  530.  
  531.     }
  532.  
  533.     
  534.     if((n->Flags&DNF_PALETTE) && n->Palette && n->Colors)
  535.     {
  536.       if(V39)
  537.       {    
  538.         Colors32[0]=n->Colors<<16;
  539.         CopyMemQuick(n->Palette,&Colors32[1],n->Colors*3*sizeof(ULONG));
  540.         Colors32[n->Colors*3+2]=0;
  541.         
  542.         ti[TagNum].ti_Tag=SA_Colors32;
  543.         ti[TagNum].ti_Data=(ULONG)Colors32;
  544.         TagNum++;
  545.       }
  546.       else
  547.       {
  548.         ULONG c;
  549.   
  550.         for(c=0;c<n->Colors;c++)
  551.         {
  552.           Colors4[c].ColorIndex=c;
  553.           Colors4[c].Red   =n->Palette[c].Red>>28;
  554.           Colors4[c].Green =n->Palette[c].Green>>28;
  555.           Colors4[c].Blue  =n->Palette[c].Blue>>28;
  556.         }
  557.         Colors4[c].ColorIndex=-1;
  558.         
  559.         ti[TagNum].ti_Tag=SA_Colors; 
  560.         ti[TagNum].ti_Data=(ULONG)Colors4;
  561.         TagNum++;
  562.       }
  563.     }
  564.  
  565.     switch(n->FontType)
  566.     {
  567.       case SFONT_SYS:
  568.         if(ns) ns->Font=0;
  569.         ti[TagNum].ti_Tag=SA_SysFont;
  570.         ti[TagNum].ti_Data=1;
  571.         TagNum++;
  572.         break;
  573.       case SFONT_MP:
  574.         if(n->Font.tta_Name)
  575.         {
  576.           if(ON=AllocOpenNode(ON))
  577.           {
  578.             ON->Flags|=ON_FONT;
  579.           
  580.             ti[TagNum].ti_Tag  =SA_Font;
  581.             ti[TagNum].ti_Data =(ULONG)&ON->TA;
  582.             TagNum++;
  583.   
  584.             if(n->Flags & FIXASPECT && modeid != -1)
  585.             {
  586.               if(GetDisplayInfoData(NULL,(UBYTE *)&dispinfo,sizeof(struct DisplayInfo),DTAG_DISP,modeid))
  587.               {
  588.                 fonttags[0].ti_Data=(ULONG)dispinfo.Resolution.x|(((ULONG)dispinfo.Resolution.y)<<16);
  589.                 n->Font.tta_Style |= FSF_TAGGED;
  590.                 n->Font.tta_Tags   =fonttags;
  591.               }
  592.             }
  593.             CloneTextAttr(&n->Font,&ON->TA);
  594.   
  595.             n->Font.tta_Style &= (~FSF_TAGGED);
  596.             n->Font.tta_Tags=NULL;
  597.           }
  598.         }
  599.         break;
  600.     }
  601.  
  602.     if(n->PubOptions==1)
  603.     {
  604.       ULONG error=FALSE;
  605.       struct TagItem badtags[]=
  606.       {
  607.         SA_BitMap,    1<<0,
  608. //      SA_PubName,   1<<1,
  609.         SA_PubSig,    1<<2,
  610.         SA_PubTask,   1<<3,
  611.         SA_BackFill,  1<<4,
  612.         TAG_DONE,     0
  613.       };
  614.       
  615.       if(TagList) error =PackBoolTags(0,TagList,badtags);
  616.       if(ns)      error|=(ns->Type & CUSTOMBITMAP);
  617.       
  618.       if(error==0)
  619.       {
  620.         if(ON=AllocOpenNode(ON))
  621.         {
  622.           struct OpenNode *won;
  623.           UBYTE number[8];
  624.           ULONG cnt=1,len;
  625.           
  626.           strncpy(ON->PubName,n->PubName,MAXPUBSCREENNAME);
  627.           ON->PubName[MAXPUBSCREENNAME]=0;
  628.           len=strlen(ON->PubName);
  629.           len=min(len,MAXPUBSCREENNAME-9);
  630.           
  631.           won=(struct OpenNode *)MPSem->OpenList.lh_Head;
  632.           while(won->on_Node.ln_Succ)
  633.           {
  634.             if(cnt > 1)   
  635.             {
  636.               number[0]='.';
  637.               stci_d(&number[1],cnt);        
  638.               ON->PubName[len]=0;
  639.               strncat(ON->PubName,number,MAXPUBSCREENNAME);
  640.               ON->PubName[MAXPUBSCREENNAME]=0;
  641.             }
  642.             
  643.             if(0==strcmp(ON->PubName,won->PubName))
  644.             {
  645.               won=(struct OpenNode *)MPSem->OpenList.lh_Head;
  646.               cnt++;
  647.             }
  648.             else
  649.               won=(struct OpenNode *)won->on_Node.ln_Succ;
  650.           }
  651.           
  652.           ON->PubName[MAXPUBSCREENNAME]=0;
  653.           ON->Flags|=ON_PUBLIC|ON_OPEN;
  654.           
  655.           ti[TagNum].ti_Tag=SA_Title;
  656.           ti[TagNum].ti_Data=(ULONG)ON->PubName;
  657.           TagNum++;
  658.   
  659.           ti[TagNum].ti_Tag=SA_PubName;
  660.           ti[TagNum].ti_Data=(ULONG)ON->PubName;
  661.           TagNum++;
  662.       
  663.           ti[TagNum].ti_Tag=SA_PubSig;
  664.           ti[TagNum].ti_Data=PublicSignal;
  665.           TagNum++;
  666.           
  667.           ti[TagNum].ti_Tag=SA_PubTask;
  668.           ti[TagNum].ti_Data=(ULONG)MPTask;
  669.           TagNum++;
  670.           
  671.           
  672.           if(!(ON->Flags & ON_FONT))
  673.           {
  674.             struct TTextAttr *ot=NULL;
  675.             
  676.             if(ns)  ot=(struct TTextAttr *)ns->Font;          
  677.             ot=(struct TTextAttr *)GetTagData(SA_Font,(ULONG)ot,TagList);
  678.             
  679.             if(ot)
  680.             {
  681.               ON->Flags|=ON_FONT;
  682.   
  683.               CloneTextAttr(ot,&ON->TA);
  684.   
  685.               ti[TagNum].ti_Tag =SA_Font;
  686.               ti[TagNum].ti_Data=(ULONG)&ON->TA;
  687.               TagNum++;
  688.             }
  689.           }
  690.         }
  691.       }
  692.     }
  693.  
  694.   }/* end if !wbscr */
  695.   else  /* Yes, this is the Workbench screen */
  696.   {
  697.     if(ON=AllocOpenNode(ON))
  698.       ON->Flags|=ON_WORKBENCH;
  699.   }
  700.  
  701.   if(look3d)
  702.   {
  703.     LONG dp;
  704.     
  705.     for(dp=0;dp<DRIPENS;dp++)
  706.       dripens[dp]=n->Pens[dp];
  707.     dripens[dp]=~0;
  708.     
  709.     ti[TagNum].ti_Tag=SA_Pens;
  710.     ti[TagNum].ti_Data=(ULONG)dripens;
  711.     TagNum++;
  712.     /*
  713.     if(depth==1)
  714.     {
  715.       depth=2;  // This nolonger works
  716.       dodepth=TRUE;
  717.       //  ti[TagNum].ti_Tag=SA_Depth;
  718.       //  ti[TagNum].ti_Data=2;
  719.       //   TagNum++;
  720.     }*/
  721.   }
  722.  
  723.   if(autoscroll)
  724.   {
  725.     ti[TagNum].ti_Tag=SA_AutoScroll;
  726.     ti[TagNum].ti_Data=TRUE;
  727.     TagNum++;
  728.   }
  729.  
  730.   
  731.   if(n->CenterFlags)
  732.   {    
  733.     if(GetDisplayInfoData(NULL,(UBYTE *)&diminfo,sizeof(struct DimensionInfo),DTAG_DIMS,modeid))
  734.     {
  735.       if(n->CenterFlags & 1)
  736.       {
  737.         if(width>-1)
  738.         {
  739.           ti[TagNum].ti_Tag=SA_Left;
  740.           ti[TagNum].ti_Data=((diminfo.StdOScan.MaxX-diminfo.StdOScan.MinX)-width)/2;
  741.           TagNum++;
  742.         }
  743.       }
  744.       if(n->CenterFlags & 2)
  745.       {
  746.         if(height>-1)
  747.         {
  748.           ti[TagNum].ti_Tag=SA_Top;
  749.           ti[TagNum].ti_Data=((diminfo.StdOScan.MaxY-diminfo.StdOScan.MinY)-height)/2;
  750.           TagNum++;
  751.         }
  752.       }
  753.     }
  754.   }
  755.  
  756.   if(n->Flags & SCRHOTKEY)
  757.   {
  758.     if(ON=AllocOpenNode(ON))
  759.     {
  760.       if(ON->HotKey=AllocVec(strlen(n->HotKey)+1,MEMF_CLEAR|MEMF_PUBLIC))
  761.       {
  762.         strcpy(ON->HotKey,n->HotKey);
  763.         ON->Cx=AddHotKey(Broker,BrokerPort,ON->HotKey,(ULONG)ON);
  764.       }
  765.     }
  766.   }
  767.   
  768.  
  769.   if(interleave && !(custombm))
  770.   {
  771.     ti[TagNum].ti_Tag=SA_Interleaved;
  772.     ti[TagNum].ti_Data=TRUE;
  773.     TagNum++;
  774.   }
  775.  
  776.  
  777.     
  778. /*
  779.   ti[TagNum].ti_Tag=SA_VideoControl; /*** just a little extra for v40 ***/
  780.   ti[TagNum].ti_Data=VCTags;
  781.   TagNum++;
  782. */
  783.   
  784.   ti[TagNum].ti_Tag=SA_MinimizeISG; /*** just a little extra for v40 ***/
  785.   ti[TagNum].ti_Data=TRUE;
  786.   TagNum++;
  787.  
  788.   if(TagList)
  789.   {
  790.     ti[TagNum].ti_Tag=TAG_MORE;
  791.     ti[TagNum].ti_Data=(ULONG)TagList;
  792.   }
  793.   else
  794.   {
  795.     ti[TagNum].ti_Tag=TAG_DONE;
  796.     ti[TagNum].ti_Data=0;
  797.   }
  798.   /**** End Setup TagList ****/
  799.   
  800.   if(ON)
  801.   {
  802.     if(ON->Flags & ON_FONT)
  803.       textfont=OpenDiskFont((struct TextAttr *)&ON->TA);
  804.   }
  805. #ifdef ADD_DEBUG_CODE  
  806.   if(MPSem->Debug)
  807.   {
  808.     kprintf("*NewTags\n");
  809.     PrintTags(ti);
  810.     kprintf("Opening\n");
  811.   }
  812. #endif
  813.  
  814.   scr=OldOpenScreenTagList(ns,ti,IBase);
  815.  
  816. #ifdef ADD_DEBUG_CODE  
  817.   if(MPSem->Debug)
  818.   {
  819.     kprintf("Screen Addr %8lx\n",scr);
  820.   }
  821. #endif
  822.  
  823.   if(scr && n->Flags & SHAREPENS && n->LockedPens && V39)
  824.   {
  825.     UBYTE *str,state=0,done=FALSE;
  826.     WORD num=0,num1=0,num2;
  827.     struct ColorMap *cm;
  828.     
  829.     cm=scr->ViewPort.ColorMap;
  830.     
  831.     str=n->LockedPens;
  832.     
  833.     while(!done)
  834.     {
  835.       if(!*str) done=TRUE;
  836.       
  837.       if(*str>='0' && *str<='9')
  838.       {
  839.         if(state==0)
  840.           state=1;
  841.         num=0;
  842.         while(*str>='0' && *str<='9')
  843.         {
  844.           num*=10;
  845.           num+=*str - '0';
  846.           str++;
  847.         }
  848.         
  849.         switch(state)
  850.         {
  851.           case 1:
  852.        //     kprintf("obtaining %d\n",num);
  853.             ObtainPen(cm,num,0,0,0, PEN_EXCLUSIVE | PEN_NO_SETCOLOR);
  854.             break;
  855.           case 2:
  856.             for(num2=num1+1;num2<=num;num2++)
  857.             {
  858.          //     kprintf("obtaining %d\n",num2);
  859.               ObtainPen(cm,num2,0,0,0, PEN_EXCLUSIVE | PEN_NO_SETCOLOR);
  860.             }
  861.             break;
  862.         }
  863.         state=0;
  864.        
  865.       }
  866.       
  867.       if(*str==' ')
  868.         for(;*str==' ';str++);
  869.       else
  870.         if(*str=='-')
  871.         {
  872.           num1=num;
  873.           state=2;
  874.           str++;
  875.         }
  876.         else
  877.           str++;
  878.     }
  879.   }
  880.  
  881.  
  882.  
  883.   if(ON)
  884.   {
  885.     if(ON->Flags & ON_FONT)
  886.       if(textfont)
  887.         CloseFont(textfont);
  888.     
  889.     if(scr)
  890.     {
  891.       ON->Screen=scr;
  892.       if(ON->Flags & ON_PUBLIC)
  893.       {
  894.         if(n->PubOptions == 1)
  895.         {
  896.           PubScreenStatus(scr,0);
  897.         }
  898.       }
  899.       AddHead(&MPSem->OpenList,(struct Node *)ON);
  900.     }
  901.     else
  902.       FreeOpenNode(ON);
  903.   }
  904.   
  905. /*
  906.   if(scr)
  907.   {
  908.     VideoControlTags(scr->ViewPort.ColorMap,
  909.                       VTAG_BORDERSPRITE_SET,TRUE,
  910.                       TAG_DONE);
  911.   }
  912. */
  913.   if(ns) ns->Font=storedfont;
  914.  
  915.  
  916.   if(!scr) scr=OldOpenScreenTagList((struct ExtNewScreen *)ns,TagList,IBase);
  917.  
  918.   ReleaseSemaphore(&MPSem->ListSem);
  919.   ReleaseSemaphore(&MPSem->NodeSem);
  920.   return(scr);
  921. }
  922.  
  923. BOOL __saveds ASM NewCloseScreen(REG __a0 struct Screen *S,
  924.                                  REG __a6 struct IntuitionBase *IBase)
  925. {
  926.   struct OpenNode *on;
  927.   BOOL rv,ok=FALSE;
  928.   ULONG pub=0;
  929.  
  930. #ifdef ADD_DEBUG_CODE  
  931.   if(MPSem->Debug)
  932.   {
  933.     kprintf("--------------------------------\nCloseScreen(%8lx) -- %s\n",S,FindTask(0)->tc_Node.ln_Name);
  934.   }
  935. #endif
  936.  
  937.  
  938.   ObtainSemaphore(&MPSem->OpenListSem);
  939.   
  940.   on=(struct OpenNode *)MPSem->OpenList.lh_Head;
  941.   while(on->on_Node.ln_Succ)
  942.   {
  943.     if(on->Screen==S)
  944.     {
  945.       Remove((struct Node *)on);
  946.       pub=on->Flags & ON_PUBLIC;
  947.       ok=TRUE;
  948.       break;
  949.     }
  950.     on=(struct OpenNode *)on->on_Node.ln_Succ;
  951.   }
  952.   
  953.   if(!ok) on=NULL;
  954.   
  955.   if(!pub)
  956.   {
  957.     if(rv=OldCloseScreen(S,IBase))
  958.       FreeOpenNode(on);
  959.     else
  960.       if(on)
  961.         AddHead(&MPSem->OpenList,(struct Node *)on);  
  962.   }
  963.   else  // Public
  964.   {
  965.     on->Flags&=(~ON_OPEN);
  966.     S->DefaultTitle=S->Title=on->PubName;
  967.     ShowTitle(S,TRUE);
  968.     AddHead(&MPSem->OpenList,(struct Node *)on);
  969.     rv=TRUE;
  970.     Signal((struct Task *)MPTask,1<<PublicSignal);
  971.   }          
  972.   ReleaseSemaphore(&MPSem->OpenListSem);   
  973.  
  974. #ifdef ADD_DEBUG_CODE  
  975.   if(MPSem->Debug)
  976.   {
  977.     kprintf("  RV=%d\n",rv);
  978.   }
  979. #endif
  980.  
  981.  
  982.   return(rv);
  983. }
  984.  
  985. struct Screen *New LockPubScreen(REG STRPTR Name)
  986. {
  987.   struct Screen *scr;
  988.   struct DefaultNode *n;
  989.   struct TagItem taglist[20];
  990.   ULONG tagnum=0,modid=INVALID_ID;
  991.  
  992.   
  993.   if(scr=LockPubScreen(Name))
  994.     return(scr);
  995.     
  996.   if(!(n=FindDNode(&MPSem->PromotionList[3],title)))
  997.   {
  998.     return(0);
  999.   }
  1000.  
  1001.   switch(n->ModeSelect)
  1002.   {
  1003.     case 1:
  1004. #ifdef ADD_DEBUG_CODE
  1005.     if(MPSem->Debug)
  1006.     {
  1007.       kprintf("Promoting Monitor\n");
  1008.     }
  1009. #endif  
  1010.       if(modeid != -1)
  1011.       {
  1012.         if(V39)
  1013.         {
  1014.           /*
  1015.           modeid=BestModeID(BIDTAG_SourceID       ,modeid,
  1016.                             BIDTAG_MonitorID      ,n->ModeID & MONITOR_ID_MASK,
  1017.                             BIDTAG_Depth          ,depth,
  1018.                             BIDTAG_DIPFMustHave   ,ehbham,
  1019.                             TAG_SKIP              ,(width==-1 ? 1:0),
  1020.                             BIDTAG_DesiredWidth   ,width,
  1021.                             TAG_SKIP              ,(height==-1 ? 1:0),
  1022.                             BIDTAG_DesiredHeight  ,height,
  1023.                             TAG_DONE);
  1024.           //kprintf("%8lx\n",modeid);
  1025.           */
  1026.         }
  1027.         else
  1028.         {
  1029.           modeid= (n->ModeID & MONITOR_ID_MASK) | (modeid & (~MONITOR_ID_MASK));
  1030.         }
  1031.         if(modeid==INVALID_ID) 
  1032.            modeid=n->ModeID;
  1033.             
  1034.         modechanged=TRUE;
  1035.       }
  1036.     case 0:          
  1037.       autoscroll  =n->AutoScroll;
  1038.       break;
  1039.     case 2:
  1040. #ifdef ADD_DEBUG_CODE
  1041.     if(MPSem->Debug)
  1042.     {
  1043.       kprintf("Promoting ScreenMode\n");
  1044.     }
  1045. #endif  
  1046.       modeid      =n->ModeID/* | ehbham*/;
  1047.       overscan    =n->OverscanType;
  1048.       width       =n->Width;
  1049.       height      =n->Height;
  1050.       autoscroll  =n->AutoScroll;
  1051.       if(n->Flags & DEPTH)
  1052.       {
  1053.         depth=n->Depth;
  1054.         dodepth=TRUE;
  1055.       }
  1056.       changed=TRUE;
  1057.       break;
  1058.     case 3:
  1059. #ifdef ADD_DEBUG_CODE
  1060.     if(MPSem->Debug)
  1061.     {
  1062.       kprintf("Promoting with Requester\n");
  1063.     }
  1064. #endif  
  1065.       if((sr=(struct ScreenModeRequester *)AllocAslRequestTags(ASL_ScreenModeRequest,
  1066.                   ASLSM_TitleText             ,title,
  1067.                   ASLSM_DoWidth               ,TRUE ,
  1068.                   ASLSM_DoHeight              ,TRUE ,
  1069.                   ASLSM_DoOverscanType        ,TRUE ,
  1070.                   ASLSM_DoAutoScroll          ,TRUE ,
  1071.                   ASLSM_DoDepth               ,n->Flags & DEPTH,
  1072.                   ASLSM_InitialAutoScroll     ,n->AutoScroll,
  1073.                   ASLSM_InitialDisplayWidth   ,n->Width,
  1074.                   ASLSM_InitialDisplayHeight  ,n->Height,
  1075.                   ASLSM_InitialDisplayID      ,n->ModeID,
  1076.                   ASLSM_InitialDisplayDepth   ,n->Depth,
  1077.                   ASLSM_NegativeText          ,GetString(MSG_REQ_USE_DEFAULT),
  1078.                   ASLSM_PropertyFlags         ,0,
  1079.                   ASLSM_PropertyMask          ,BADMODES,                      
  1080.                   TAG_END 
  1081.                   )))
  1082.       {
  1083.         if(AslRequest(sr,NULL))
  1084.         {
  1085.           modeid    =sr->sm_DisplayID | ehbham;
  1086.           overscan  =sr->sm_OverscanType;
  1087.           width     =sr->sm_DisplayWidth;
  1088.           height    =sr->sm_DisplayHeight;    
  1089.           changed   =TRUE;
  1090.           if(n->Flags & DEPTH)
  1091.           {
  1092.             depth=sr->sm_DisplayDepth;
  1093.             dodepth=TRUE;
  1094.           }
  1095.         }
  1096.         FreeAslRequest(sr);  
  1097.       }
  1098.       break; 
  1099.     }/* end switch*/
  1100.  
  1101.   
  1102.   
  1103.   
  1104. }
  1105.  
  1106. LONG __saveds ASM NewCloseWorkBench(REG __a6 struct IntuitionBase *IBase)
  1107. {   
  1108.   LONG retval;
  1109.   
  1110. #ifdef ADD_DEBUG_CODE  
  1111.   if(MPSem->Debug)
  1112.   {
  1113.     kprintf("--------------------------------\nCloseWorkBench() -- %s\n",FindTask(0)->tc_Node.ln_Name);
  1114.   }
  1115. #endif
  1116.  
  1117. //  ObtainSemaphore(&MPSem->OpenListSem);
  1118.   
  1119.   if(retval=OldCloseWorkBench(IBase))
  1120.     FreeWBOpenNode();
  1121.   
  1122. //  ReleaseSemaphore(&MPSem->OpenListSem);
  1123.  
  1124. #ifdef ADD_DEBUG_CODE  
  1125.   if(MPSem->Debug)
  1126.   {
  1127.     kprintf("  RV=%d\n",retval);
  1128.   }
  1129. #endif
  1130.   return(retval);
  1131. }
  1132.   
  1133. void FreeOpenNode(struct OpenNode *on)
  1134. {
  1135.  
  1136. #ifdef ADD_DEBUG_CODE  
  1137.   if(MPSem->Debug)
  1138.   {
  1139.     kprintf("--------------------------------\nFreeOpenNode(%8lx)\n",on);
  1140.   }
  1141. #endif
  1142.  
  1143.   
  1144.   if(on) 
  1145.   { 
  1146.     //if(on->TA.tta_Name)
  1147.     FreeVec(on->TA.tta_Name);
  1148.     //if(on->TA.tta_Tags)
  1149.     FreeVec(on->TA.tta_Tags);
  1150.     //if(on->Cx)
  1151.     DeleteCxObjAll(on->Cx);
  1152.     FreeVec(on->HotKey);
  1153.     if(V39)
  1154.       FreeBitMap(on->BitMap);
  1155.     FreeMem(on,sizeof(struct OpenNode));
  1156.  
  1157. #ifdef ADD_DEBUG_CODE  
  1158.     if(MPSem->Debug)
  1159.     {
  1160.       kprintf("  Freed\n");
  1161.     }
  1162. #endif
  1163.  
  1164.  
  1165.  
  1166.   }
  1167. }
  1168.  
  1169. void FreeWBOpenNode(void)
  1170. {
  1171.   struct OpenNode *on;
  1172.  
  1173. #ifdef ADD_DEBUG_CODE  
  1174.   if(MPSem->Debug)
  1175.   {
  1176.     kprintf("--------------------------------\nFreeWBOpenNode()\n");
  1177.   }
  1178. #endif
  1179.  
  1180.   on=(struct OpenNode *)MPSem->OpenList.lh_Head;
  1181.   while(on->on_Node.ln_Succ)
  1182.   {
  1183.     if((on->Flags & ON_WORKBENCH))
  1184.     {
  1185.       Remove((struct Node *)on);
  1186.       FreeOpenNode(on);
  1187.       return;
  1188.     }
  1189.     on=(struct OpenNode *)on->on_Node.ln_Succ;
  1190.   }
  1191. #ifdef ADD_DEBUG_CODE  
  1192.   if(MPSem->Debug)
  1193.   {
  1194.     kprintf("  Not Freed\n");
  1195.   }
  1196. #endif
  1197.  
  1198.   
  1199. }
  1200.  
  1201. struct Window __saveds ASM *NewOpenWindow(REG __a0 struct ExtNewWindow *nw,
  1202.                                           REG __a6 struct IntuitionBase *IBase)
  1203. {
  1204.   struct Window *w;
  1205.   
  1206. #ifdef ADD_DEBUG_CODE
  1207.   if(MPSem->Debug)
  1208.   {
  1209.     kprintf("--------------------------------\nOpenWindow(%8lx) -- %s\n",nw,FindTask(0)->tc_Node.ln_Name);
  1210.   }
  1211. #endif
  1212.  
  1213.   w=NewOpenWindowTagList(nw,nw->Flags & WFLG_NW_EXTENDED ? nw->Extension:0,IBase);
  1214.   
  1215. #ifdef ADD_DEBUG_CODE
  1216.   if(MPSem->Debug)
  1217.   {
  1218.     kprintf("  RV=%8lx\n",w);
  1219.   }
  1220. #endif
  1221.   return(w);
  1222. }
  1223.  
  1224. struct Window __saveds ASM *NewOpenWindowTagList(REG __a0 struct ExtNewWindow *nw,
  1225.                                                  REG __a1 struct TagItem *TagList,
  1226.                                                  REG __a6 struct IntuitionBase *IBase)
  1227. {
  1228.   struct Window *w;
  1229.   struct TagItem ti[]={WA_NewLookMenus , TRUE , 
  1230.                        TAG_DONE , 0};
  1231.  
  1232. //  ObtainSemaphoreShared(&MPSem->ListSem);
  1233.  
  1234. #ifdef ADD_DEBUG_CODE
  1235.   if(MPSem->Debug)
  1236.   {
  1237.     kprintf("--------------------------------\nOpenWindowTagList(%8lx,%8lx) -- %s\n",nw,TagList,FindTask(0)->tc_Node.ln_Name);
  1238.   }
  1239. #endif
  1240.  
  1241.   if(MPSem->EnabledNLM)  
  1242.   {
  1243.     if(TagList)
  1244.     {
  1245.       ti[1].ti_Tag =TAG_MORE;
  1246.       ti[1].ti_Data=(ULONG)TagList;
  1247.     }
  1248.     TagList=ti;              
  1249.   }
  1250.  
  1251.   w=(struct Window *)OldOpenWindowTagList((struct NewWindow *)nw,TagList,IBase);
  1252.  
  1253. #ifdef ADD_DEBUG_CODE
  1254.   if(MPSem->Debug)
  1255.   {
  1256.     kprintf("  RV=%8lx\n",w);
  1257.   }
  1258. #endif
  1259.  
  1260. //  ReleaseSemaphore(&MPSem->ListSem);
  1261.   
  1262.   return(w); 
  1263. }
  1264.  
  1265. BOOL __saveds ASM NewLayoutMenusA(REG __a0 struct Menu *fm,
  1266.                                   REG __a1 APTR vi, 
  1267.                                   REG __a2 struct TagItem *tags)
  1268. {
  1269.   BOOL rv;
  1270.   struct TagItem ti[2]=
  1271.   {
  1272.     GTMN_NewLookMenus,TRUE,
  1273.     TAG_DONE,0
  1274.   };
  1275.  
  1276. #ifdef ADD_DEBUG_CODE
  1277.   if(MPSem->Debug)
  1278.   {
  1279.     kprintf("--------------------------------\nLayoutMenus(%8lx,%8lx,%8lx) -- %s\n",fm,vi,tags,FindTask(0)->tc_Node.ln_Name);
  1280.   }
  1281. #endif
  1282.  
  1283. //  ObtainSemaphoreShared(&MPSem->ListSem);
  1284.  
  1285.   if(MPSem->EnabledNLM)    
  1286.   {
  1287.     if(tags)
  1288.     {
  1289.       ti[1].ti_Tag=TAG_MORE;
  1290.       ti[1].ti_Data=(ULONG)tags;
  1291.     }
  1292.     rv=(BOOL)OldLayoutMenusA(fm,vi,ti,GadToolsBase);
  1293.   }
  1294.   else
  1295.     rv=(BOOL)OldLayoutMenusA(fm,vi,tags,GadToolsBase);
  1296. #ifdef ADD_DEBUG_CODE
  1297.   if(MPSem->Debug)
  1298.   {
  1299.     kprintf("  RV=%8lx\n",rv);
  1300.   }
  1301. #endif
  1302.   
  1303. //  ReleaseSemaphore(&MPSem->ListSem);
  1304.   return(rv); 
  1305. }
  1306.  
  1307. void CatchDNode(ULONG dest, UBYTE *Name)
  1308. {
  1309.   struct DefaultNode *dnode;
  1310.   LONG l;
  1311.   
  1312.   if(dnode=AllocDefaultNode(Name))
  1313.   {
  1314.     dnode->Type         =dest;
  1315.     dnode->Width        =width;
  1316.     dnode->Height       =height;
  1317.     dnode->AutoScroll   =autoscroll;
  1318.     dnode->ModeSelect   =0;
  1319.     dnode->ModeID       =modeid;
  1320.     dnode->OverscanType =overscan;
  1321.     dnode->Look3D       =look3d;
  1322.     dnode->Flags        =0;
  1323.     dnode->Depth        =depth;
  1324.     if(interleave)
  1325.       dnode->Flags|=INTERLEAVE;
  1326.  
  1327.     l=0;
  1328.     if(screenpens)
  1329.       for(;l<NumDriPens && screenpens[l]!=(~0);l++)
  1330.         dnode->Pens[l]=screenpens[l]; 
  1331.  
  1332.     for(;l<NumDriPens;l++)
  1333.       dnode->Pens[l]=0;//defaultpens[l];
  1334.  
  1335.      PutMsg(CatchPort,(struct Message *)dnode);
  1336.   }
  1337.   return;
  1338. }
  1339.  
  1340. #ifdef ADD_DEBUG_CODE
  1341. #include <tagitemmacros.h>
  1342. void PrintTags(struct TagItem *tags)
  1343. {
  1344.   struct TagItem *tag,*tstate;
  1345.   
  1346.  
  1347.   ProcessTagList(tags,tag,tstate)
  1348.   {
  1349.     kprintf(FindTagSting(tag->ti_Tag),tag->ti_Data);
  1350.     kprintf("\n");
  1351.   }
  1352. }
  1353.  
  1354.  
  1355. ULONG TagID[]=
  1356. {
  1357.   SA_Left,
  1358.   SA_Top,
  1359.   SA_Width,
  1360.   SA_Height,
  1361.   SA_Depth,
  1362.   SA_DetailPen,
  1363.   SA_BlockPen,
  1364.   SA_Title,
  1365.   SA_Colors,
  1366.   SA_ErrorCode,
  1367.   SA_Font,
  1368.   SA_SysFont,
  1369.   SA_Type,
  1370.   SA_BitMap,
  1371.   SA_PubName,
  1372.   SA_PubSig,
  1373.   SA_PubTask,
  1374.   SA_DisplayID,
  1375.   SA_DClip,
  1376.   SA_Overscan,
  1377.   SA_Obsolete1,
  1378.   SA_ShowTitle,
  1379.   SA_Behind,
  1380.   SA_Quiet,
  1381.   SA_AutoScroll,
  1382.   SA_Pens,
  1383.   SA_FullPalette,
  1384.   SA_ColorMapEntries,
  1385.   SA_Parent,
  1386.   SA_Draggable,
  1387.   SA_Exclusive,
  1388.   SA_SharePens,
  1389.   SA_BackFill,
  1390.   SA_Interleaved,
  1391.   SA_Colors32,
  1392.   SA_VideoControl,
  1393.   SA_FrontChild,
  1394.   SA_BackChild,
  1395.   SA_LikeWorkbench,
  1396.   SA_Reserved,
  1397.   SA_MinimizeISG,
  1398.   0xffffffff,
  1399. };
  1400.  
  1401. UBYTE *TagStrings[]=
  1402. {
  1403.   "SA_Left            %ld",
  1404.   "SA_Top             %ld",
  1405.   "SA_Width           %ld",
  1406.   "SA_Height          %ld",
  1407.   "SA_Depth           %ld",
  1408.   "SA_DetailPen       %ld",
  1409.   "SA_BlockPen        %ld",
  1410.   "SA_Title           %s",
  1411.   "SA_Colors          %lx",
  1412.   "SA_ErrorCode       %lx",
  1413.   "SA_Font            %lx",
  1414.   "SA_SysFont         %ld",
  1415.   "SA_Type            %lx",
  1416.   "SA_BitMap          %lx",
  1417.   "SA_PubName         %s",
  1418.   "SA_PubSig          %lx",
  1419.   "SA_PubTask         %lx",
  1420.   "SA_DisplayID       %lx",
  1421.   "SA_DClip           %lx",
  1422.   "SA_Overscan        %ld",
  1423.   "SA_Obsolete1       %ld",
  1424.   "SA_ShowTitle       %ld",
  1425.   "SA_Behind          %ld",
  1426.   "SA_Quiet           %ld",
  1427.   "SA_AutoScroll      %ld",
  1428.   "SA_Pens            %lx",
  1429.   "SA_FullPalette     %ld",
  1430.   "SA_ColorMapEntries %ld",
  1431.   "SA_Parent          %lx",
  1432.   "SA_Draggable       %ld",
  1433.   "SA_Exclusive       %ld",
  1434.   "SA_SharePens       %ld",
  1435.   "SA_BackFill        %lx",
  1436.   "SA_Interleaved     %ld",
  1437.   "SA_Colors32        %lx",
  1438.   "SA_VideoControl    %lx",
  1439.   "SA_FrontChild      %lx",
  1440.   "SA_BackChild       %lx",
  1441.   "SA_LikeWorkbench   %ld",
  1442.   "SA_Reserved        %ld",
  1443.   "SA_MinimizeISG     %ld",
  1444.   "Unknown Tag        %ld"
  1445. };
  1446.  
  1447. UBYTE *FindTagSting(ULONG id)
  1448. {
  1449.   ULONG l;
  1450.   
  1451.   for(l=0;;l++)
  1452.   {
  1453.     if(TagID[l]==id || TagID[l]==0xffffffff)
  1454.       return(TagStrings[l]);
  1455.   }
  1456.   return(TagStrings[l]);
  1457. }
  1458.  
  1459. void PrintDefNode(struct DefaultNode *DN)
  1460. {
  1461.   kprintf("DefaultNode(%8lx)\n Def_Node.ln_Name: %s\n",DN,DN->Def_Node.ln_Name);
  1462.   kprintf(" Type: %ld\n ModeSelect: %ld\n ModeID: %8lx\n Width: %ld Height: %ld\n"
  1463.          " OverscanType:%ld\n AutoScroll: %ld\n Look3D: %ld\n Flags: %8lx\n "
  1464.          "OrigDisplayID: %8lx\n",
  1465.          DN->Type,DN->ModeSelect,DN->ModeID,DN->Width,DN->Height,DN->OverscanType,
  1466.          DN->AutoScroll,DN->Look3D,DN->Flags,
  1467.          DN->OrigDisplayID);
  1468. }
  1469. #endif
  1470.  
  1471.  
  1472. void CloneTextAttr(struct TTextAttr *Source, struct TTextAttr *Dest)
  1473. {
  1474.   CopyMem(Source,Dest,sizeof(struct TextAttr));
  1475.     
  1476.   if(Dest->tta_Name=AllocVec(strlen(Source->tta_Name)+1,MEMF_CLEAR|MEMF_PUBLIC))
  1477.   {
  1478.     strcpy(Dest->tta_Name,Source->tta_Name);
  1479.     if(Dest->tta_Style & FSF_TAGGED)
  1480.     {
  1481.       if(!(Dest->tta_Tags=CloneTagItems(Source->tta_Tags)))
  1482.         Dest->tta_Style &= (~FSF_TAGGED);
  1483.     }
  1484.   }
  1485.   else
  1486.   {
  1487.     Dest->tta_Name=Topaz;
  1488.     Dest->tta_YSize=8;
  1489.     Dest->tta_Style=0;
  1490.     Dest->tta_Flags=0;
  1491.   }
  1492. }
  1493.  
  1494.  
  1495.